home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 526-550 / disk_527 / toolmanager / source / statuswindow.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  16KB  |  553 lines

  1. /*
  2.  * statuswindow.c   V1.4
  3.  *
  4.  * status window
  5.  *
  6.  * (c) 1991 by Stefan Becker
  7.  *
  8.  */
  9. #include "ToolManager.h"
  10.  
  11. /* Structures for window */
  12. extern char WBScreenName[];
  13. static char wtbc[]=DEFPROGNAME ": HotKey=";
  14. static char *wtb;
  15. extern struct NewWindow nw;
  16. static struct Window *w;
  17. static struct AppWindow *aw;
  18. static struct MsgPort *wp;
  19. static ULONG wl=20,wt=20;    /* Window leftedge & topedge */
  20. static ULONG ww,wh;          /* Window width & height */
  21. static struct Screen *pubsc; /* Workbench screen */
  22.  
  23. /* Structures for window gadgets */
  24. static void *vi;             /* Visual information is a *PRIVATE* data field! */
  25. static struct Gadget *gl;    /* Gadget list */
  26. static char StatusText[]="Active Tools: 00"; /* Text gadget text */
  27. static struct Gadget *lvgad;                 /* ListView gadget */
  28. WORD lvord=-1;                               /* LV gadget ordinal number */
  29. static WORD lvtop=0;                         /* LV gadget top item number */
  30. static ULONG oldsecs=0,oldmicros=0;          /* LV double click check */
  31. #define LVGAD_ID 1
  32. static char NTButtonText[]="New";            /* New Tool gadget text */
  33. #define NTGAD_ID 2
  34. static char ETButtonText[]="Edit";           /* Edit Tool gadget text */
  35. #define ETGAD_ID 3
  36. static char STButtonText[]="Start";          /* Start Tool gadget text */
  37. #define STGAD_ID 4
  38. static char RTButtonText[]="Remove";         /* Remove Tool gadget text */
  39. #define RTGAD_ID 5
  40. static char SCButtonText[]="Save";           /* Save config gadget text */
  41. #define SCGAD_ID 6
  42. static char ENButtonText[]="Enable";         /* Enable broker gadget text */
  43. #define ENGAD_ID 7
  44. static char DIButtonText[]="Disable";        /* Disable broker gadget text */
  45. #define DIGAD_ID 8
  46. static char QUButtonText[]="Quit";           /* Quit gadget text */
  47. #define QUGAD_ID 9
  48.  
  49. /* Structures for window menu */
  50. static struct Menu *wmn=NULL;
  51. #define HIMENU_ID  1
  52. static char ABMenuText[]="About";
  53. #define ABMENU_ID  2
  54. #define QUMENU_ID  3
  55. #define ENMENU_ID  4
  56. #define DIMENU_ID  5
  57. #define STMENU_ID  6
  58. #define NTMENU_ID  7
  59. #define ETMENU_ID  8
  60. #define SCMENU_ID  9
  61. #define RTMENU_ID 10
  62. static struct NewMenu mdata[]={
  63.       {NM_TITLE,MyName,NULL,0,~0,NULL},
  64.        {NM_ITEM,"Hide"      ,"H",0,~0,HIMENU_ID},
  65.        {NM_ITEM,ABMenuText  ,NULL,0,~0,ABMENU_ID},
  66.        {NM_ITEM,QUButtonText,"Q",0,~0,QUMENU_ID},
  67.       {NM_TITLE,"HotKeys",NULL,0,~0,NULL},
  68.        {NM_ITEM,ENButtonText,"A",0,~0,ENMENU_ID},
  69.        {NM_ITEM,DIButtonText,"D",0,~0,DIMENU_ID},
  70.       {NM_TITLE,"Tools",NULL,0,~0,NULL},
  71.        {NM_ITEM,STButtonText,"S",0,~0,STMENU_ID},
  72.        {NM_ITEM,NTButtonText,"N",0,~0,NTMENU_ID},
  73.        {NM_ITEM,ETButtonText,"E",0,~0,ETMENU_ID},
  74.        {NM_ITEM,SCButtonText,"C",0,~0,SCMENU_ID},
  75.        {NM_ITEM,RTButtonText,"R",0,~0,RTMENU_ID},
  76.       {NM_END,NULL,NULL,0,~0,NULL}};
  77.  
  78. /* Data for "About" requester */
  79. static UBYTE AboutText[]="ToolManager V" TM_VERSION " (" TM_DATE ")\n"\
  80.                          "© " TM_CRYEAR "  Stefan Becker\n"\
  81.                          "This program is freely distributable";
  82.  
  83. static struct EasyStruct AboutES={sizeof(struct EasyStruct),0,ABMenuText,
  84.                                   AboutText,"Ok"};
  85.  
  86.  
  87. /* Create status line */
  88. static void PrintStatusLine(void)
  89. {
  90.  StatusText[14]=ToolCount/10+'0'; /* Hack */
  91.  StatusText[15]=ToolCount%10+'0';
  92. }
  93.  
  94. /* Create all status window gadgets & menus */
  95. static BOOL CreateGadgets(void)
  96. {
  97.  struct NewGadget ng;
  98.  struct Gadget *g;
  99.  struct TextFont *f;              /* Window font */
  100.  struct RastPort tmprp;           /* RastPort for font-sensitive trick */
  101.  UWORD wg,width,fheight;
  102.  UWORD leftedge,topborder;
  103.  UWORD lvright;
  104.  
  105.  /* Open window font */
  106.  if (!(f=OpenFont(pubsc->Font))) goto cg1;
  107.  fheight=f->tf_YSize; /* Font height */
  108.  leftedge=pubsc->WBorLeft;
  109.  topborder=pubsc->WBorTop+fheight+1;
  110.  
  111.  /* Initialize temporary RastPort */
  112.  InitRastPort(&tmprp);
  113.  SetFont(&tmprp,f);
  114.  
  115.  /* Calculate window & gadget width */
  116.  ww=TextLength(&tmprp,wtb,strlen(wtb))+WDRAGBARLEN;
  117.  wg=TextLength(&tmprp,DIButtonText,sizeof(DIButtonText)-1)+INTERWIDTH;
  118.  width=TextLength(&tmprp,RTButtonText,sizeof(RTButtonText)-1)+INTERWIDTH;
  119.  if (width>wg) wg=width;
  120.  if ((width=3*wg+4*INTERWIDTH)>ww) ww=width;
  121.  
  122.  /* Create gadget list */
  123.  gl=NULL;
  124.  g=CreateContext(&gl);
  125.  
  126.  /*  1. gadget: Text, status line */
  127.  PrintStatusLine();
  128.  width=TextLength(&tmprp,StatusText,sizeof(StatusText)-1)+INTERWIDTH;
  129.  ng.ng_LeftEdge=leftedge+(ww-width)/2;
  130.  ng.ng_TopEdge=topborder+INTERHEIGHT;
  131.  ng.ng_Width=width;
  132.  ng.ng_Height=fheight;
  133.  ng.ng_GadgetText=StatusText;
  134.  ng.ng_TextAttr=pubsc->Font;
  135.  ng.ng_Flags=PLACETEXT_IN;
  136.  ng.ng_VisualInfo=vi;
  137.  ng.ng_UserData=0;
  138.  if (!(g=CreateGadget(TEXT_KIND,g,&ng,TAG_DONE))) goto cg2;
  139.  g->GadgetText->DrawMode=JAM2; /* Argh, why doesn't exist a tag for this? */
  140.  
  141.  /*  2. gadget: ListView, tool list */
  142.  ng.ng_LeftEdge=leftedge+INTERWIDTH/2;
  143.  ng.ng_TopEdge+=g->Height+INTERHEIGHT;
  144.  ng.ng_Width=ww-INTERWIDTH;
  145.  ng.ng_Height=7*fheight;
  146.  ng.ng_GadgetText=NULL;
  147.  ng.ng_GadgetID=LVGAD_ID;
  148.  if (!(lvgad=g=CreateGadget(LISTVIEW_KIND,g,&ng,
  149.                             GTLV_Labels,&ToolList,
  150.                             /* If an item was selected, use it as top item */
  151.                             GTLV_Top,lvtop,
  152.                             GTLV_ShowSelected,NULL,
  153.                             GTLV_Selected,lvord,
  154.                             TAG_DONE))) goto cg2;
  155.  lvright=ng.ng_LeftEdge+g->Width;
  156.  
  157.  /*  3. gadget: Button, new tool */
  158.  ng.ng_TopEdge+=g->Height+fheight+2*INTERHEIGHT;
  159.  ng.ng_Width=wg;
  160.  ng.ng_Height=fheight+INTERHEIGHT;
  161.  ng.ng_GadgetText=NTButtonText;
  162.  ng.ng_GadgetID=NTGAD_ID;
  163.  if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto cg2;
  164.  
  165.  /*  4. gadget: Button, edit tool definition */
  166.  ng.ng_LeftEdge=leftedge+(ww-wg)/2;
  167.  ng.ng_GadgetText=ETButtonText;
  168.  ng.ng_GadgetID=ETGAD_ID;
  169.  if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto cg2;
  170.  
  171.  /*  5. gadget: Button, start tool */
  172.  ng.ng_LeftEdge=lvright-wg;
  173.  ng.ng_GadgetText=STButtonText;
  174.  ng.ng_GadgetID=STGAD_ID;
  175.  if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto cg2;
  176.  
  177.  /*  6. gadget: Button, remove tool */
  178.  ng.ng_LeftEdge=leftedge+INTERWIDTH/2;
  179.  ng.ng_TopEdge+=g->Height+INTERHEIGHT;
  180.  ng.ng_GadgetText=RTButtonText;
  181.  ng.ng_GadgetID=RTGAD_ID;
  182.  if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto cg2;
  183.  
  184.  /*  7. gadget: Button, save config */
  185.  ng.ng_LeftEdge=lvright-wg;
  186.  ng.ng_GadgetText=SCButtonText;
  187.  ng.ng_GadgetID=SCGAD_ID;
  188.  if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto cg2;
  189.  
  190.  /*  8. gadget: Button, enable broker */
  191.  ng.ng_LeftEdge=leftedge+INTERWIDTH/2;
  192.  ng.ng_TopEdge+=g->Height+2*INTERHEIGHT;
  193.  ng.ng_GadgetText=ENButtonText;
  194.  ng.ng_GadgetID=ENGAD_ID;
  195.  if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto cg2;
  196.  
  197.  /*  9. gadget: Button, disable broker */
  198.  ng.ng_LeftEdge=leftedge+(ww-wg)/2;
  199.  ng.ng_Width=wg;
  200.  ng.ng_GadgetText=DIButtonText;
  201.  ng.ng_GadgetID=DIGAD_ID;
  202.  if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto cg2;
  203.  
  204.  /* 10. gadget: Button, Quit */
  205.  ng.ng_LeftEdge=lvright-wg;
  206.  ng.ng_GadgetText=QUButtonText;
  207.  ng.ng_GadgetID=QUGAD_ID;
  208.  if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto cg2;
  209.  
  210.  /* Calculate window height */
  211.  wh=ng.ng_TopEdge+g->Height+INTERHEIGHT-topborder;
  212.  
  213.  /* Create menus */
  214.  if (!(wmn=CreateMenus(mdata,
  215.                        GTMN_FullMenu,TRUE,
  216.                        TAG_DONE))) goto cg2;
  217.  
  218.  /* Layout menus */
  219.  if (!LayoutMenus(wmn,vi,TAG_DONE)) goto cg3;
  220.  
  221.  CloseFont(f);        /* Close window font */
  222.  return(TRUE);        /* All gadgets created! */
  223.  
  224.  /* Something went wrong.... */
  225. cg3: FreeMenus(wmn);
  226. cg2: FreeGadgets(gl);
  227.      CloseFont(f);
  228. cg1: return(FALSE);
  229. }
  230.  
  231. /* Open status window */
  232. void OpenStatusWindow(void)
  233. {
  234.  if (statwinsig) return;
  235.  
  236.  /* Create window title */
  237.  if (!(wtb=malloc(strlen(wtbc)+strlen(PopUpHotKey)+1)))
  238.   goto osw1;
  239.  strcpy(wtb,wtbc);
  240.  strcat(wtb,PopUpHotKey);
  241.  
  242.  if (!(pubsc=LockPubScreen(WBScreenName))) /* Lock Workbench screen */
  243.   goto osw2;
  244.  
  245.  if (!(vi=GetVisualInfo(pubsc,TAG_DONE))) /* Get visual information */
  246.   goto osw3;
  247.  
  248.  if (!CreateGadgets())                    /* Create Gadgets */
  249.   goto osw4;
  250.  
  251.  /* Open window */
  252.  if (!(w=OpenWindowTags(&nw,
  253.                         WA_Left,wl,
  254.                         WA_Top,wt,
  255.                         WA_InnerWidth,ww,
  256.                         WA_InnerHeight,wh,
  257.                         WA_Title,wtb,
  258.                         WA_PubScreen,pubsc,
  259.                         WA_AutoAdjust,TRUE,
  260.                         TAG_DONE)))
  261.   goto osw5;
  262.  
  263.  wp=w->UserPort; /* Retrieve window port */
  264.  
  265.  /* Circumvent an intuition.library bug. See AutoDocs for LockPubScreen() */
  266.  UnlockPubScreen(NULL,pubsc);
  267.  pubsc=NULL;
  268.  
  269.  /* Add gadget list to window */
  270.  AddGList(w,gl,(UWORD) -1,(UWORD) -1,NULL);
  271.  RefreshGList(gl,w,NULL,(UWORD) -1);
  272.  GT_RefreshWindow(w,NULL);
  273.  
  274.  /* Add menu to window */
  275.  if (!SetMenuStrip(w,wmn))
  276.   goto osw6;
  277.  
  278.  /* Notify Workbench about window */
  279.  if (!(aw=AddAppWindow(NULL,NULL,w,MyMP,TAG_DONE)))
  280.   goto osw7;
  281.  
  282.  /* Window open! */
  283.  statwinsig=1L<<wp->mp_SigBit;
  284.  return;
  285.  
  286.  /* Something went wrong.... */
  287. osw7: ClearMenuStrip(w);
  288. osw6: CloseWindow(w);
  289. osw5: FreeMenus(wmn);
  290.       FreeGadgets(gl);
  291. osw4: FreeVisualInfo(vi);
  292. osw3: if (pubsc) UnlockPubScreen(NULL,pubsc);
  293. osw2: free(wtb);
  294. osw1: return;
  295. }
  296.  
  297. /* Close status window */
  298. void CloseStatusWindow(void)
  299. {
  300.  if (statwinsig)
  301.   {
  302.    wl=w->LeftEdge;      /* Retreive window parameters for next open */
  303.    wt=w->TopEdge;
  304.    RemoveAppWindow(aw);
  305.    ClearMenuStrip(w);
  306.    CloseWindow(w);
  307.    FreeMenus(wmn);      /* Release allocated resources */
  308.    FreeGadgets(gl);
  309.    FreeVisualInfo(vi);
  310.    free(wtb);
  311.    statwinsig=0;
  312.   }
  313. }
  314.  
  315. /* Refresh status window gadgets */
  316. void RefreshStatusWindow(void)
  317. {
  318.  PrintStatusLine();
  319.  RefreshGList(gl,w,NULL,2); /* Refresh only the first two gadgets */
  320. }
  321.  
  322. /* Find tool with lvord */
  323. static struct ToolNode *FindTool(void)
  324. {
  325.  if (lvord>=0)             /* Is the ordinal number valid? */
  326.   {                        /* Yes, search tool */
  327.    struct ToolNode *tn;
  328.    WORD i=0;               /* Counter */
  329.  
  330.    /* Scan tool list until the ordinal number is reached */
  331.    for (tn=GetHead(&ToolList); tn; tn=GetSucc(tn),i++)
  332.     if (i>=lvord) break;
  333.  
  334.    return(tn);
  335.   }
  336.  return(NULL);
  337. }
  338.  
  339. /* If the window is open, detach tool list from ListView gadget */
  340. void DetachToolList(void)
  341. {
  342.  if (statwinsig) GT_SetGadgetAttrs(lvgad,w,NULL,GTLV_Labels,-1,TAG_DONE);
  343. }
  344.  
  345. /* If the window is open, attach tool list to ListView gadget */
  346. void AttachToolList(void)
  347. {
  348.  if (statwinsig) GT_SetGadgetAttrs(lvgad,w,NULL,
  349.                                    GTLV_Labels,&ToolList,
  350.                                    /* If an item was selected, use it as
  351.                                       top item */
  352.                                    GTLV_Top,lvtop,
  353.                                    GTLV_Selected,lvord,
  354.                                    TAG_DONE);
  355. }
  356.  
  357. /* Create new empty tool */
  358. static void AddEmptyTool(void)
  359. {
  360.  struct ConfigBlock *cb;
  361.  
  362.  /* Get memory */
  363.  if (cb=malloc(sizeof(struct ConfigBlock)))
  364.   {
  365.    /* Initialize config block */
  366.    InitConfigBlock(cb);
  367.    cb->cb_Type=TNTYPE_DUMMY;
  368.    strcpy(cb->cb_Alias,"New Tool");
  369.  
  370.    /* Add tool */
  371.    if (AddToolNode(cb,StartupCD))
  372.     {
  373.      /* Refresh Gadgets */
  374.      RefreshStatusWindow();
  375.  
  376.      /* Set new tool as active ListView item */
  377.      if (!editwinsig)
  378.       {
  379.        DetachToolList();
  380.        lvtop=lvord=ToolCount-1;
  381.        AttachToolList();
  382.       }
  383.     }
  384.    else DisplayBeep(NULL);
  385.  
  386.    /* Free memory */
  387.    free(cb);
  388.   }
  389. }
  390.  
  391. /* Open edit window */
  392. static void EditTool(void)
  393. {
  394.  struct ToolNode *tn;
  395.  
  396.  if (!editwinsig)
  397.   {
  398.    tn=FindTool();
  399.    if (tn) OpenEditWindow(w->LeftEdge,w->TopEdge,ww,tn);
  400.   }
  401. }
  402.  
  403. /* Remove tool */
  404. static void SWRemoveTool(void)
  405. {
  406.  struct ToolNode *tn;
  407.  
  408.  if (!editwinsig)   /* Edit window not open? */
  409.   {
  410.    tn=FindTool();   /* Search tool */
  411.    if (tn)          /* Tool found? */
  412.     {
  413.      lvord=-1;         /* Invalidate ordinal number */
  414.  
  415.      DetachToolList(); /* Remove tool from list */
  416.      RemToolNode(tn);
  417.      AttachToolList();
  418.  
  419.      RefreshStatusWindow(); /* Refresh Gadgets */
  420.     }
  421.   }
  422. }
  423.  
  424. /* Start tool */
  425. static void SWStartTool(void)
  426. {
  427.  struct ToolNode *tn;
  428.  
  429.  tn=FindTool();
  430.  if (tn) StartTool(tn,NULL);
  431. }
  432.  
  433. /* Handle window events */
  434. void HandleStatWinEvent(void)
  435. {
  436.  BOOL clwin=FALSE; /* TRUE if window should be closed */
  437.  struct IntuiMessage *msg;
  438.  
  439.  while (msg=GT_GetIMsg(wp)) /* Pre-process Intuition messages */
  440.   {
  441.    switch (msg->Class)
  442.     {
  443.      case CLOSEWINDOW:      /* User clicked the close gadget */
  444.       clwin=TRUE;           /* Yes, close window */
  445.       break;
  446.      case REFRESHWINDOW:    /* Window must be refreshed */
  447.       GT_BeginRefresh(w);
  448.       GT_EndRefresh(w,TRUE);
  449.       break;
  450.      case GADGETUP:         /* User released a gadget */
  451.       switch(((struct Gadget *) msg->IAddress)->GadgetID)
  452.        {
  453.         case LVGAD_ID:      /* User selected ListView item */
  454.          struct ToolNode *tn;
  455.          ULONG secs=msg->Seconds,micros=msg->Micros;
  456.  
  457.          /* If no edit window is open then check for double click */
  458.          if ((lvord==msg->Code) && DoubleClick(oldsecs,oldmicros,secs,micros))
  459.          /* User double clicked the LV gadget --> Start tool */
  460.           SWStartTool();
  461.          /* No double click --> retrieve the ordinal number of selected item */
  462.          else lvtop=lvord=msg->Code;
  463.  
  464.          /* Save current time */
  465.          oldsecs=secs;
  466.          oldmicros=micros;
  467.          break;
  468.         case NTGAD_ID:      /* User selected new tool gadget */
  469.          AddEmptyTool();
  470.          break;
  471.         case ETGAD_ID:      /* User selected edit tool definition gadget */
  472.          EditTool();
  473.          break;
  474.         case STGAD_ID:      /* User selected start tool gadget */
  475.          SWStartTool();
  476.          break;
  477.         case RTGAD_ID:      /* User selected remove tool gadget */
  478.          SWRemoveTool();
  479.          break;
  480.         case SCGAD_ID:      /* User selected save config gadget */
  481.          WriteConfigFile(w);
  482.          break;
  483.         case ENGAD_ID:      /* User selected enable broker gadget */
  484.          ActivateCxObj(MyBroker,1);
  485.          break;
  486.         case DIGAD_ID:      /* User selected enable broker gadget */
  487.          ActivateCxObj(MyBroker,0);
  488.          break;
  489.         case QUGAD_ID:      /* User selected quit gadget */
  490.          if (!clwin)
  491.           {
  492.            SetQuitFlag();
  493.            if (!running) clwin=TRUE;
  494.           }
  495.          break;
  496.        }
  497.       break;
  498.      case MENUPICK:         /* User selected a menu */
  499.       USHORT mnum=msg->Code;
  500.  
  501.       while (mnum!=MENUNULL) /* Scan all menus */
  502.        {
  503.         struct MenuItem *mi=ItemAddress(wmn,mnum);
  504.  
  505.         switch(GTMENUITEM_USERDATA(mi))
  506.          {
  507.           case HIMENU_ID:   /* User selected hide menu item */
  508.            clwin=TRUE;
  509.            break;
  510.           case ABMENU_ID:
  511.            EasyRequest(NULL,&AboutES,NULL,NULL);
  512.            break;
  513.           case QUMENU_ID:   /* User selected quit menu item */
  514.            if (!clwin)
  515.             {
  516.              SetQuitFlag();
  517.              if (!running) clwin=TRUE;
  518.             }
  519.            break;
  520.           case ENMENU_ID:   /* User selected enable broker menu item */
  521.            ActivateCxObj(MyBroker,1);
  522.            break;
  523.           case DIMENU_ID:   /* User selected disable broker menu item */
  524.            ActivateCxObj(MyBroker,0);
  525.            break;
  526.           case STMENU_ID:   /* User selected start tool menu item */
  527.            SWStartTool();
  528.            break;
  529.           case NTMENU_ID:   /* User selected new tool menu item */
  530.            AddEmptyTool();
  531.            break;
  532.           case ETMENU_ID:   /* User selected edit tool definition menu item */
  533.            EditTool();
  534.            break;
  535.           case SCMENU_ID:   /* User selected save config menu item */
  536.            WriteConfigFile(w);
  537.            break;
  538.           case RTMENU_ID:   /* User selected remove tool menu item */
  539.            SWRemoveTool();
  540.            break;
  541.          }
  542.  
  543.         /* Next selected menu */
  544.         mnum=mi->NextSelect;
  545.        }
  546.       break;
  547.     }
  548.    GT_ReplyIMsg(msg); /* Reply pre-processed message */
  549.   }
  550.  
  551.  if (clwin) CloseStatusWindow();
  552. }
  553.